Realice un programa que permita el entrenamiento y prueba de un perceptrón simple con una cantidad variable de entradas.
OR_trn <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/OR_trn.csv", col_names = FALSE)
OR_tst <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/OR_tst.csv", col_names = FALSE)
Utilizamos las funciones implementadas en el archivo “PerceptronSimple.R”
pesos <- entrenarPerceptron(OR_trn, maxEpocas = 10, critFinalizacion = 0.8)
## Epoca: 1 - Tasa: 1
# Modelo obtenido
pesos
## [1] 1 1 1
El entrenamiento nos devuelve la tasa obtenida en cada época y al final mostramos los valores de los pesos w que definen la recta del modelo.
$ pesos = [w_0, w_1, w_2, …w_n] $
graficarRectaSeparacion(pesos, OR_trn)
En la gráfica vemos como la recta del modelo separa el dominio según la clase.
test <- aplicarPerceptron(pesos, OR_tst)
test$tasa
## [1] 1
Por ser este un problema sencillo donde las clases son separables por una recta, la tasa de aciertos en test nos da un 100%.
XOR_trn <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/XOR_trn.csv", col_names = FALSE)
XOR_tst <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/XOR_tst.csv", col_names = FALSE)
pesos <- entrenarPerceptron(XOR_trn, maxEpocas = 10, critFinalizacion = 0.8)
## Epoca: 1 - Tasa: 0.4965
## Epoca: 2 - Tasa: 0.4965
## Epoca: 3 - Tasa: 0.4965
## Epoca: 4 - Tasa: 0.4965
## Epoca: 5 - Tasa: 0.4965
## Epoca: 6 - Tasa: 0.4965
## Epoca: 7 - Tasa: 0.4965
## Epoca: 8 - Tasa: 0.4965
## Epoca: 9 - Tasa: 0.4965
## Epoca: 10 - Tasa: 0.4965
pesos
## [1] 504.50000 -2.75460 -2.85718
Vemos que luego de 10 épocas el perceptrón simple no logra resolver el problema del XOR, ni tampoco mejorar su tasa de aciertos.
graficarRectaSeparacion(pesos, XOR_trn)
En la gráfica vemos la recta obtenida que deja todos los patrones clasificados de igual manera.
test <- aplicarPerceptron(pesos, XOR_tst)
test$tasa
## [1] 0.44
Este problema no pudo ser resuelto por le perceptrón simple, la tasa de aciertos obtenida es peor que el azar.
En los resultados obtenidos verificamos que no se puede resolver el problema XOR con el perceptrón simple porque no es posible dividir la clase con una recta que separe el dominio en dos.
La tasa de aprendizaje nos permite variar cuanto se actualizan los valores de los pesos. Una tasa muy baja puede generar que el algoritmo demore mucho en llegar al mínimo, y una tasa muy alta puede generar que el algoritmo diverja y nunca llegue a un mínimo. En nuestro caso, se implementó una función que posee una tasa de aprendizaje de 0,05 (nu=0.05) por defecto y no fue necesario cambiarlo.
spheres1d10 <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/spheres1d10.csv", col_names = FALSE)
#Nombre de las columnas
colnames(spheres1d10)
## [1] "X1" "X2" "X3" "X4"
#Dimenciones de los datos
dim(spheres1d10)
## [1] 1000 4
plot_ly(x=spheres1d10$X1, y=spheres1d10$X2, z=spheres1d10$X3, type="scatter3d",
mode="markers", color=spheres1d10$X4)
Utilizamos la función implementada en el archivo “Particiones.R”
particion_spheres1d10 <- generarNParticionesPorID(dataset = spheres1d10, nroParticiones = 5,
porcEntrenamiento = 0.8, semilla = 1,
clase = "X4")
Esta función nos devuelve un listado de 5 listas de ID para entrenamiento, de aproximadamente 800 elementos, y 5 listas de ID para prueba, de aproximadamente 200 elementos.
for (n in seq(1,5)) {
print(glue::glue("Partición: {n}"))
#Entrenamiento
pesos <- entrenarPerceptron(spheres1d10[particion_spheres1d10$trn[[n]],],
maxEpocas = 10, critFinalizacion = 0.8)
print(glue::glue("Pesos: {pesos}"))
#Prueba
test <- aplicarPerceptron(pesos, spheres1d10[particion_spheres1d10$tst[[n]],])
print(glue::glue("Tasa de aciertos en test: {test$tasa}"))
}
## Partición: 1
## Epoca: 1 - Tasa: 0.53125
## Epoca: 2 - Tasa: 0.53125
## Epoca: 3 - Tasa: 0.53125
## Epoca: 4 - Tasa: 0.53125
## Epoca: 5 - Tasa: 0.53125
## Epoca: 6 - Tasa: 0.53125
## Epoca: 7 - Tasa: 0.53125
## Epoca: 8 - Tasa: 0.53125
## Epoca: 9 - Tasa: 0.53125
## Epoca: 10 - Tasa: 0.53125
## Pesos: 187.850000000008
## Pesos: -109.2078535
## Pesos: -0.170800000000001
## Pesos: -16.9217549999999
## Tasa de aciertos en test: 0.53
## Partición: 2
## Epoca: 1 - Tasa: 0.53125
## Epoca: 2 - Tasa: 0.53125
## Epoca: 3 - Tasa: 0.53125
## Epoca: 4 - Tasa: 0.53125
## Epoca: 5 - Tasa: 0.53125
## Epoca: 6 - Tasa: 0.53125
## Epoca: 7 - Tasa: 0.53125
## Epoca: 8 - Tasa: 0.53125
## Epoca: 9 - Tasa: 0.53125
## Epoca: 10 - Tasa: 0.53125
## Pesos: 187.650000000008
## Pesos: -112.205494
## Pesos: 5.63569049999998
## Pesos: -15.1915654999999
## Tasa de aciertos en test: 0.53
## Partición: 3
## Epoca: 1 - Tasa: 0.53125
## Epoca: 2 - Tasa: 0.53125
## Epoca: 3 - Tasa: 0.53125
## Epoca: 4 - Tasa: 0.53125
## Epoca: 5 - Tasa: 0.53125
## Epoca: 6 - Tasa: 0.53125
## Epoca: 7 - Tasa: 0.53125
## Epoca: 8 - Tasa: 0.53125
## Epoca: 9 - Tasa: 0.53125
## Epoca: 10 - Tasa: 0.53125
## Pesos: 187.700000000008
## Pesos: -112.365995
## Pesos: 11.2066119999999
## Pesos: -9.74150049999998
## Tasa de aciertos en test: 0.53
## Partición: 4
## Epoca: 1 - Tasa: 0.530586766541823
## Epoca: 2 - Tasa: 0.530586766541823
## Epoca: 3 - Tasa: 0.530586766541823
## Epoca: 4 - Tasa: 0.530586766541823
## Epoca: 5 - Tasa: 0.530586766541823
## Epoca: 6 - Tasa: 0.530586766541823
## Epoca: 7 - Tasa: 0.530586766541823
## Epoca: 8 - Tasa: 0.530586766541823
## Epoca: 9 - Tasa: 0.530586766541823
## Epoca: 10 - Tasa: 0.530586766541823
## Pesos: 188.450000000009
## Pesos: -105.3191515
## Pesos: 3.28833400000001
## Pesos: -11.9641719999999
## Tasa de aciertos en test: 0.532663316582915
## Partición: 5
## Epoca: 1 - Tasa: 0.530663329161452
## Epoca: 2 - Tasa: 0.530663329161452
## Epoca: 3 - Tasa: 0.530663329161452
## Epoca: 4 - Tasa: 0.530663329161452
## Epoca: 5 - Tasa: 0.530663329161452
## Epoca: 6 - Tasa: 0.530663329161452
## Epoca: 7 - Tasa: 0.530663329161452
## Epoca: 8 - Tasa: 0.530663329161452
## Epoca: 9 - Tasa: 0.530663329161452
## Epoca: 10 - Tasa: 0.530663329161452
## Pesos: 187.850000000008
## Pesos: -109.286727
## Pesos: -1.4164115
## Pesos: -12.592915
## Tasa de aciertos en test: 0.532338308457711
spheres2d10 <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/spheres2d10.csv", col_names = FALSE)
spheres2d50 <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/spheres2d50.csv", col_names = FALSE)
spheres2d70 <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/spheres2d70.csv", col_names = FALSE)
Llamamos a la función dos veces con dos semillas para obtener las 10 particiones. La función implementada genera las particiones sin reemplazo, con una relación 80/20 no se pueden generar más de 5 particiones.
# 10%
particion_spheres2d10 <- generarNParticionesPorID(dataset = spheres2d10, nroParticiones = 5,
porcEntrenamiento = 0.8, semilla = 1,
clase = "X4")
particion_spheres2d10$trn <- c(particion_spheres2d10$trn, generarNParticionesPorID(
dataset = spheres2d10, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12,
clase = "X4")$trn)
particion_spheres2d10$tst <- c(particion_spheres2d10$tst, generarNParticionesPorID(
dataset = spheres2d10, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12,
clase = "X4")$tst)
# 50%
particion_spheres2d50 <- generarNParticionesPorID(dataset = spheres2d50, nroParticiones = 5,
porcEntrenamiento = 0.8, semilla = 1,
clase = "X4")
particion_spheres2d50$trn <- c(particion_spheres2d50$trn, generarNParticionesPorID(
dataset = spheres2d50, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12,
clase = "X4")$trn)
particion_spheres2d50$tst <- c(particion_spheres2d50$tst, generarNParticionesPorID(
dataset = spheres2d50, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12,
clase = "X4")$tst)
# 70%
particion_spheres2d70 <- generarNParticionesPorID(dataset = spheres2d70, nroParticiones = 5,
porcEntrenamiento = 0.8, semilla = 1,
clase = "X4")
particion_spheres2d70$trn <- c(particion_spheres2d70$trn, generarNParticionesPorID(
dataset = spheres2d70, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12,
clase = "X4")$trn)
particion_spheres2d70$tst <- c(particion_spheres2d70$tst, generarNParticionesPorID(
dataset = spheres2d70, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12,
clase = "X4")$tst)
– Datos con desviaciones del 10%
plot_ly(x=spheres2d10$X1, y=spheres2d10$X2, z=spheres2d10$X3, type="scatter3d",
mode="markers", color=spheres2d10$X4)
tasaMedia <- 0
for (n in seq(1,10)) {
print(glue::glue("Partición: {n}"))
#Entrenamiento
pesos <- entrenarPerceptron(spheres2d10[particion_spheres2d10$trn[[n]],],
maxEpocas = 5, critFinalizacion = 0.79)
print(glue::glue("Pesos: {pesos}"))
#Pruba
test <- aplicarPerceptron(pesos, spheres2d10[particion_spheres2d10$tst[[n]],])
print(glue::glue("Tasa de aciertos en test: {test$tasa}"))
tasaMedia <- tasaMedia + test$tasa
}
## Partición: 1
## Epoca: 1 - Tasa: 0.76525
## Epoca: 2 - Tasa: 0.78
## Epoca: 3 - Tasa: 0.783
## Epoca: 4 - Tasa: 0.7855
## Epoca: 5 - Tasa: 0.7865
## Pesos: 224.750000000017
## Pesos: -221.062984499999
## Pesos: 7.253625
## Pesos: -7.78130499999998
## Tasa de aciertos en test: 0.799
## Partición: 2
## Epoca: 1 - Tasa: 0.7725
## Epoca: 2 - Tasa: 0.78425
## Epoca: 3 - Tasa: 0.78875
## Epoca: 4 - Tasa: 0.79075
## Pesos: 177.500000000006
## Pesos: -174.5293535
## Pesos: 5.64960150000001
## Pesos: -6.04182649999999
## Tasa de aciertos en test: 0.778
## Partición: 3
## Epoca: 1 - Tasa: 0.7755
## Epoca: 2 - Tasa: 0.7845
## Epoca: 3 - Tasa: 0.7885
## Epoca: 4 - Tasa: 0.7885
## Epoca: 5 - Tasa: 0.79075
## Pesos: 221.350000000016
## Pesos: -217.638075999999
## Pesos: 7.6643725
## Pesos: -7.18889749999998
## Tasa de aciertos en test: 0.786
## Partición: 4
## Epoca: 1 - Tasa: 0.770057485628593
## Epoca: 2 - Tasa: 0.781054736315921
## Epoca: 3 - Tasa: 0.784803799050237
## Epoca: 4 - Tasa: 0.786303424143964
## Epoca: 5 - Tasa: 0.787803049237691
## Pesos: 222.700000000016
## Pesos: -219.0483805
## Pesos: 7.40051049999999
## Pesos: -7.70832349999997
## Tasa de aciertos en test: 0.794794794794795
## Partición: 5
## Epoca: 1 - Tasa: 0.773943485871468
## Epoca: 2 - Tasa: 0.784446111527882
## Epoca: 3 - Tasa: 0.789197299324831
## Epoca: 4 - Tasa: 0.791947986996749
## Pesos: 176.000000000006
## Pesos: -173.1365555
## Pesos: 6.10863649999999
## Pesos: -5.82814349999998
## Tasa de aciertos en test: 0.787212787212787
## Partición: 6
## Epoca: 1 - Tasa: 0.77375
## Epoca: 2 - Tasa: 0.784
## Epoca: 3 - Tasa: 0.78775
## Epoca: 4 - Tasa: 0.79
## Epoca: 5 - Tasa: 0.7915
## Pesos: 219.450000000016
## Pesos: -215.843120499999
## Pesos: 6.938335
## Pesos: -7.47346399999998
## Tasa de aciertos en test: 0.777
## Partición: 7
## Epoca: 1 - Tasa: 0.76725
## Epoca: 2 - Tasa: 0.78175
## Epoca: 3 - Tasa: 0.7865
## Epoca: 4 - Tasa: 0.789
## Epoca: 5 - Tasa: 0.79175
## Pesos: 222.100000000016
## Pesos: -218.459041999999
## Pesos: 7.152588
## Pesos: -7.80188199999998
## Tasa de aciertos en test: 0.783
## Partición: 8
## Epoca: 1 - Tasa: 0.77375
## Epoca: 2 - Tasa: 0.785
## Epoca: 3 - Tasa: 0.79025
## Pesos: 135.299999999997
## Pesos: -132.7442795
## Pesos: 4.94413500000001
## Pesos: -4.45324449999999
## Tasa de aciertos en test: 0.777
## Partición: 9
## Epoca: 1 - Tasa: 0.768057985503624
## Epoca: 2 - Tasa: 0.777805548612847
## Epoca: 3 - Tasa: 0.782804298925269
## Epoca: 4 - Tasa: 0.784803799050237
## Epoca: 5 - Tasa: 0.785553611597101
## Pesos: 222.950000000016
## Pesos: -219.1872425
## Pesos: 7.38372199999999
## Pesos: -7.51598999999998
## Tasa de aciertos en test: 0.794794794794795
## Partición: 10
## Epoca: 1 - Tasa: 0.769942485621405
## Epoca: 2 - Tasa: 0.780445111277819
## Epoca: 3 - Tasa: 0.784696174043511
## Epoca: 4 - Tasa: 0.787946986746687
## Epoca: 5 - Tasa: 0.78944736184046
## Pesos: 221.050000000016
## Pesos: -217.553555499999
## Pesos: 7.66553299999999
## Pesos: -7.06385049999999
## Tasa de aciertos en test: 0.805194805194805
print(glue::glue("Tasa de aciertos media en test: {tasaMedia/10}"))
## Tasa de aciertos media en test: 0.788199718199718
– Datos con desviaciones del 50%
plot_ly(x=spheres2d50$X1, y=spheres2d50$X2, z=spheres2d50$X3, type="scatter3d", mode="markers", color=spheres2d50$X4)
tasaMedia <- 0
for (n in seq(1,10)) {
print(glue::glue("Partición: {n}"))
#Entrenamiento
pesos <- entrenarPerceptron(spheres2d50[particion_spheres2d50$trn[[n]],],
maxEpocas = 5, critFinalizacion = 0.79)
print(glue::glue("Pesos: {pesos}"))
#Pruba
test <- aplicarPerceptron(pesos, spheres2d50[particion_spheres2d50$tst[[n]],])
print(glue::glue("Tasa de aciertos en test: {test$tasa}"))
tasaMedia <- tasaMedia + test$tasa
}
## Partición: 1
## Epoca: 1 - Tasa: 0.789
## Epoca: 2 - Tasa: 0.79
## Epoca: 3 - Tasa: 0.7905
## Pesos: 126.249999999995
## Pesos: -116.3539735
## Pesos: 10.7698595
## Pesos: -12.5806515
## Tasa de aciertos en test: 0.776
## Partición: 2
## Epoca: 1 - Tasa: 0.788302924268933
## Epoca: 2 - Tasa: 0.791802049487628
## Pesos: 85.3999999999973
## Pesos: -78.5787109999999
## Pesos: 7.09278050000001
## Pesos: -9.30471149999998
## Tasa de aciertos en test: 0.78978978978979
## Partición: 3
## Epoca: 1 - Tasa: 0.786196549137284
## Epoca: 2 - Tasa: 0.791197799449862
## Pesos: 85.8999999999973
## Pesos: -78.990983
## Pesos: 7.67113250000001
## Pesos: -9.54348099999999
## Tasa de aciertos en test: 0.792207792207792
## Partición: 4
## Epoca: 1 - Tasa: 0.782054486378405
## Epoca: 2 - Tasa: 0.785553611597101
## Epoca: 3 - Tasa: 0.787053236690827
## Epoca: 4 - Tasa: 0.787053236690827
## Epoca: 5 - Tasa: 0.787053236690827
## Pesos: 211.350000000014
## Pesos: -194.315286
## Pesos: 18.4535655
## Pesos: -21.3377595
## Tasa de aciertos en test: 0.787787787787788
## Partición: 5
## Epoca: 1 - Tasa: 0.784696174043511
## Epoca: 2 - Tasa: 0.787446861715429
## Epoca: 3 - Tasa: 0.787946986746687
## Epoca: 4 - Tasa: 0.787946986746687
## Epoca: 5 - Tasa: 0.787696924231058
## Pesos: 210.400000000014
## Pesos: -194.2384475
## Pesos: 17.2406485
## Pesos: -21.807366
## Tasa de aciertos en test: 0.804195804195804
## Partición: 6
## Epoca: 1 - Tasa: 0.78125
## Epoca: 2 - Tasa: 0.783
## Epoca: 3 - Tasa: 0.78425
## Epoca: 4 - Tasa: 0.7855
## Epoca: 5 - Tasa: 0.786
## Pesos: 213.450000000014
## Pesos: -197.2598605
## Pesos: 18.381788
## Pesos: -20.977634
## Tasa de aciertos en test: 0.801
## Partición: 7
## Epoca: 1 - Tasa: 0.785803549112722
## Epoca: 2 - Tasa: 0.789052736815796
## Epoca: 3 - Tasa: 0.790302424393902
## Pesos: 128.249999999995
## Pesos: -118.031558
## Pesos: 10.9605245
## Pesos: -13.55215
## Tasa de aciertos en test: 0.791791791791792
## Partición: 8
## Epoca: 1 - Tasa: 0.788447111777944
## Epoca: 2 - Tasa: 0.790947736934234
## Pesos: 85.6999999999973
## Pesos: -78.7525794999999
## Pesos: 7.2218615
## Pesos: -9.51060149999999
## Tasa de aciertos en test: 0.79020979020979
## Partición: 9
## Epoca: 1 - Tasa: 0.787803049237691
## Epoca: 2 - Tasa: 0.789052736815796
## Epoca: 3 - Tasa: 0.789802549362659
## Epoca: 4 - Tasa: 0.790802299425144
## Pesos: 165.450000000003
## Pesos: -152.465952
## Pesos: 14.287108
## Pesos: -16.9160525
## Tasa de aciertos en test: 0.783783783783784
## Partición: 10
## Epoca: 1 - Tasa: 0.788197049262316
## Epoca: 2 - Tasa: 0.79169792448112
## Pesos: 86.4499999999972
## Pesos: -79.5191819999999
## Pesos: 7.06969350000001
## Pesos: -9.36168599999997
## Tasa de aciertos en test: 0.79020979020979
print(glue::glue("Tasa de aciertos media en test: {tasaMedia/10}"))
## Tasa de aciertos media en test: 0.790697632997633
– Datos con desviaciones del 70%
plot_ly(x=spheres2d70$X1, y=spheres2d70$X2, z=spheres2d70$X3, type="scatter3d", mode="markers", color=spheres2d70$X4)
tasaMedia <- 0
for (n in seq(1,10)) {
print(glue::glue("Partición: {n}"))
#Entrenamiento
pesos <- entrenarPerceptron(spheres2d70[particion_spheres2d70$trn[[n]],],
maxEpocas = 10, critFinalizacion = 0.77)
print(glue::glue("Pesos: {pesos}"))
#Pruba
test <- aplicarPerceptron(pesos, spheres2d70[particion_spheres2d70$tst[[n]],])
print(glue::glue("Tasa de aciertos en test: {test$tasa}"))
tasaMedia <- tasaMedia + test$tasa
}
## Partición: 1
## Epoca: 1 - Tasa: 0.77075
## Pesos: 46.8999999999995
## Pesos: -41.3578315
## Pesos: 4.877081
## Pesos: -6.87418050000001
## Tasa de aciertos en test: 0.774
## Partición: 2
## Epoca: 1 - Tasa: 0.773556610847288
## Pesos: 47.1999999999995
## Pesos: -41.6143880000001
## Pesos: 5.1557375
## Pesos: -6.7593325
## Tasa de aciertos en test: 0.764764764764765
## Partición: 3
## Epoca: 1 - Tasa: 0.773943485871468
## Pesos: 46.9499999999995
## Pesos: -41.5467160000001
## Pesos: 4.486325
## Pesos: -7.0751025
## Tasa de aciertos en test: 0.767232767232767
## Partición: 4
## Epoca: 1 - Tasa: 0.770307423144214
## Pesos: 47.7999999999994
## Pesos: -42.3050485
## Pesos: 4.909167
## Pesos: -7.210052
## Tasa de aciertos en test: 0.786786786786787
## Partición: 5
## Epoca: 1 - Tasa: 0.775443860965241
## Pesos: 46.7999999999995
## Pesos: -41.237675
## Pesos: 4.8206895
## Pesos: -7.073508
## Tasa de aciertos en test: 0.766233766233766
## Partición: 6
## Epoca: 1 - Tasa: 0.7725
## Pesos: 47.1499999999995
## Pesos: -41.809585
## Pesos: 4.636054
## Pesos: -6.9702425
## Tasa de aciertos en test: 0.773
## Partición: 7
## Epoca: 1 - Tasa: 0.773056735816046
## Pesos: 47.6999999999994
## Pesos: -41.9619245000001
## Pesos: 5.10788299999999
## Pesos: -7.0768385
## Tasa de aciertos en test: 0.764764764764765
## Partición: 8
## Epoca: 1 - Tasa: 0.765441360340085
## Epoca: 2 - Tasa: 0.765191297824456
## Epoca: 3 - Tasa: 0.764941235308827
## Epoca: 4 - Tasa: 0.764691172793198
## Epoca: 5 - Tasa: 0.764441110277569
## Epoca: 6 - Tasa: 0.764941235308827
## Epoca: 7 - Tasa: 0.764941235308827
## Epoca: 8 - Tasa: 0.764691172793198
## Epoca: 9 - Tasa: 0.764441110277569
## Epoca: 10 - Tasa: 0.764691172793198
## Pesos: 445.700000000067
## Pesos: -395.948906000001
## Pesos: 51.5011865000001
## Pesos: -57.9248295
## Tasa de aciertos en test: 0.791208791208791
## Partición: 9
## Epoca: 1 - Tasa: 0.7808047988003
## Pesos: 46.3499999999995
## Pesos: -40.8424720000001
## Pesos: 4.59528749999999
## Pesos: -7.4213425
## Tasa de aciertos en test: 0.757757757757758
## Partición: 10
## Epoca: 1 - Tasa: 0.773693423355839
## Pesos: 47.3999999999994
## Pesos: -42.0085840000001
## Pesos: 4.77458199999999
## Pesos: -7.1187695
## Tasa de aciertos en test: 0.774225774225774
print(glue::glue("Tasa de aciertos media en test: {tasaMedia/10}"))
## Tasa de aciertos media en test: 0.771997517297517
El uso de validación cruzada nos permite usar todos los datos para test y poder evaluar de mejor manera si el método utilizado para la generación del modelo es bueno.
Al aumentar la dispersión de los datos, disminuye la tasa de aciertos porque el plano no permite separar correctamente las clases.
El algoritmo implementado se encuentra en el archivo “PerceptronMulticapa.R”
concentlite <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/concentlite.csv", col_names = FALSE)
ggplot(data=concentlite, aes(x=X1, y=X2,color=X3))+geom_point()
resultado <- entrenarPerceptronM(concentlite, maxEpocas = 500, critFinalizacion = 0.9, nu=0.1,
arquitectura = c(4,1))
## ##------ Tue Nov 12 19:39:27 2019 ------##
## [1] 0.9184853
## [1] 0.9183602
## [1] 0.9182631
## [1] 0.9181799
## [1] 0.9181052
## [1] 0.9180369
## [1] 0.9179742
## [1] 0.9179169
## [1] 0.9178648
## [1] 0.9178177
## [1] 0.9177753
## [1] 0.9177374
## [1] 0.9177035
## [1] 0.9176733
## [1] 0.9176465
## [1] 0.9176226
## [1] 0.9176014
## [1] 0.9175825
## [1] 0.9175658
## [1] 0.9175511
## [1] 0.917538
## [1] 0.9175266
## [1] 0.9175165
## [1] 0.9175078
## [1] 0.9175002
## [1] 0.9174937
## [1] 0.9174881
## [1] 0.9174834
## [1] 0.9174795
## [1] 0.9174764
## [1] 0.9174738
## [1] 0.9174719
## [1] 0.9174705
## [1] 0.9174696
## [1] 0.9174692
## [1] 0.9174691
## [1] 0.9174694
## [1] 0.91747
## [1] 0.9174709
## [1] 0.9174721
## [1] 0.9174735
## [1] 0.917475
## [1] 0.9174768
## [1] 0.9174787
## [1] 0.9174807
## [1] 0.9174828
## [1] 0.917485
## [1] 0.9174872
## [1] 0.9174894
## [1] 0.9174917
## [1] 0.9174939
## [1] 0.9174961
## [1] 0.9174983
## [1] 0.9175003
## [1] 0.9175023
## [1] 0.9175041
## [1] 0.9175058
## [1] 0.9175073
## [1] 0.9175085
## [1] 0.9175095
## [1] 0.9175103
## [1] 0.9175107
## [1] 0.9175108
## [1] 0.9175104
## [1] 0.9175096
## [1] 0.9175083
## [1] 0.9175064
## [1] 0.9175039
## [1] 0.9175007
## [1] 0.9174966
## [1] 0.9174917
## [1] 0.9174857
## [1] 0.9174785
## [1] 0.91747
## [1] 0.91746
## [1] 0.9174483
## [1] 0.9174346
## [1] 0.9174187
## [1] 0.9174003
## [1] 0.9173788
## [1] 0.917354
## [1] 0.9173252
## [1] 0.9172917
## [1] 0.9172528
## [1] 0.9172075
## [1] 0.9171547
## [1] 0.917093
## [1] 0.9170206
## [1] 0.9169354
## [1] 0.9168347
## [1] 0.9167153
## [1] 0.916573
## [1] 0.9164025
## [1] 0.9161971
## [1] 0.915948
## [1] 0.9156438
## [1] 0.9152698
## [1] 0.9148059
## [1] 0.9142256
## [1] 0.9134925
## [1] 0.9125563
## [1] 0.9113458
## [1] 0.9097584
## [1] 0.9076425
## [1] 0.9047689
## [1] 0.9007873
## [1] 0.8951668
## [1] 0.8871347
## [1] 0.8756657
## [1] 0.8596319
## [1] 0.8382931
## [1] 0.812233
## [1] 0.7841945
## [1] 0.7583998
## [1] 0.7381327
## [1] 0.724091
## [1] 0.7150658
## [1] 0.7094027
## [1] 0.7057877
## [1] 0.7033727
## [1] 0.7016579
## [1] 0.7003612
## [1] 0.6993271
## [1] 0.6984716
## [1] 0.6977481
## [1] 0.6971267
## [1] 0.6965814
## [1] 0.696084
## [1] 0.6955998
## [1] 0.6950834
## [1] 0.69447
## [1] 0.6936574
## [1] 0.6924693
## [1] 0.6905761
## [1] 0.687325
## [1] 0.6813779
## [1] 0.6700009
## [1] 0.6478958
## [1] 0.6058186
## [1] 0.5324492
## [1] 0.4371175
## [1] 0.3527346
## ##------ Tue Nov 12 19:46:32 2019 ------##
concentlite <- cbind(concentlite,resultado$resultado)
ggplot(data=concentlite, aes(x=X1, y=X2, color=X3, shape=as.factor(resultado$resultado)))+geom_point()
plot(resultado$error)
resultado$tasa
## [1] 0.9063625